home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1997-10-26 | 21.6 KB | 707 lines |
- (*----------------------------------------------------------------------*
- * *
- * MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
- * ÿ ÿ ÿ ÿ ÿ *
- *----------------------------------------------------------------------*
- * Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
- *----------------------------------------------------------------------*
- * Dieses Modul ist urheberrechtlich geschtzt. *
- * *
- * Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
- * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
- * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
- * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
- * Einverstndnisserklrung des Autors. *
- * *
- * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
- * fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
- * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
- * widerrufen. *
- *----------------------------------------------------------------------*)
-
- IMPLEMENTATION MODULE mtUtils;
-
- (*----------------------------------------------------------------------*
- * Int. Vers | Datum | Name | nderung *
- *-----------+----------+------+----------------------------------------*
- * 3.00 | 18.01.92 | Hp | *
- * 3.01 | 24.01.92 | Hp | Die Routinen fr Objektmanipulation *
- * | | | wurden so angepasst, da sie sowohl *
- * | | | mit normalen als auch mit Userdef- *
- * | | | Objekten zurechtkommen! Dabei gehen *
- * | | | die Routinen davon aus, da die User- *
- * | | | def-Objekte mit dem Moduls mtXobjects *
- * | | | installiert wurden. *
- * 3.02 | 03.02.92 | Hp | SetState und SetFlag implementiert. *
- *----------------------------------------------------------------------*)
-
-
-
-
- (* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
- (* *)
- (*$R- Range-Checks *)
- (*$S- Stack-Check *)
- (* *)
- (*----------------------------------------------*)
-
-
-
-
-
-
- FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
- Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
- Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
- sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
- CastToChar, CastToByte, CastToByteset, CastToInt,
- CastToCard, CastToBitset, CastToWord, CastToLInt,
- CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
- TosVersion, Accessory, Basepage, SysHeader, TosDate;
-
-
-
-
-
-
- FROM SYSTEM IMPORT ADDRESS, ADR;
- FROM MagicStrings IMPORT Assign, Append, Length, Pos, Cap;
- FROM MagicAES IMPORT GBOX, GTEXT, GBOXTEXT, GIMAGE, GPROGDEF, GIBOX,
- GBUTTON, GBOXCHAR, GSTRING, GFTEXT, GFBOXTEXT,
- GICON, GCICON, GTITLE, SELECTABLE, DEFAULT, Exit,
- EDITABLE, RBUTTON, LASTOB, TOUCHEXIT, HIDETREE,
- INDIRECT, SELECTED, CROSSED, CHECKED, DISABLED,
- OUTLINED, SHADOWED, DRAW3D, WHITEBAK, OBJECT,
- GrafMkstate, ARROW, FLATHAND, GrafMouse,
- ObjcOffset;
- IMPORT MagicAES, MagicXBIOS, mtXobjects;
-
- (*----------------------------------------------------------------------*
- * Einfache Rechenfunktioen *
- *----------------------------------------------------------------------*)
-
- PROCEDURE Min (c1, c2: sINTEGER): sINTEGER;
- BEGIN
- IF c1 < c2 THEN RETURN VAL (INTEGER, c1);
- ELSE RETURN VAL (INTEGER, c2);
- END;
- END Min;
-
- PROCEDURE Max (c1, c2: sINTEGER): sINTEGER;
- BEGIN
- IF c1 < c2 THEN RETURN VAL (INTEGER, c2);
- ELSE RETURN VAL (INTEGER, c1);
- END;
- END Max;
-
- (*----------------------------------------------------------------------*)
-
- PROCEDURE GetHibyte (value: sINTEGER): sINTEGER;
- VAR t: AnyType;
- BEGIN
- t.lint:= value; RETURN CastToInt (t.b2);
- END GetHibyte;
-
- PROCEDURE GetLowbyte (value: sINTEGER): sINTEGER;
- VAR t: AnyType;
- BEGIN
- t.lint:= value; RETURN CastToInt (t.b1);
- END GetLowbyte;
-
- (*----------------------------------------------------------------------*)
-
- PROCEDURE InclFlag (tree: ADDRESS; entry, bit: sINTEGER);
- VAR dial: tObjcTree;
- BEGIN
- dial:= tree; INCL(dial^[entry].obFlags, bit);
- END InclFlag;
-
- PROCEDURE ExclFlag (tree: ADDRESS; entry, bit: sINTEGER);
- VAR dial: tObjcTree;
- BEGIN
- dial:= tree; EXCL(dial^[entry].obFlags, bit);
- END ExclFlag;
-
- PROCEDURE SetFlag (tree: ADDRESS; entry, bit: sINTEGER; set: BOOLEAN);
- VAR dial: tObjcTree;
- BEGIN
- dial:= tree;
- IF set THEN INCL (dial^[entry].obFlags, bit);
- ELSE EXCL (dial^[entry].obFlags, bit);
- END;
- END SetFlag;
-
- PROCEDURE InFlag (tree: ADDRESS; entry, bit: sINTEGER): BOOLEAN;
- VAR dial: tObjcTree;
- BEGIN
- dial:= tree; RETURN (CastToCard (bit) IN dial^[entry].obFlags);
- END InFlag;
-
- PROCEDURE InclState (tree: ADDRESS; entry, bit: sINTEGER);
- VAR dial: tObjcTree;
- BEGIN
- dial:= tree; INCL(dial^[entry].obState, bit);
- END InclState;
-
- PROCEDURE ExclState (tree: ADDRESS; entry, bit: sINTEGER);
- VAR dial: tObjcTree;
- BEGIN
- dial:= tree; EXCL(dial^[entry].obState, bit);
- END ExclState;
-
- PROCEDURE SetState (tree: ADDRESS; entry, bit: sINTEGER; set: BOOLEAN);
- VAR dial: tObjcTree;
- BEGIN
- dial:= tree;
- IF set THEN INCL (dial^[entry].obState, bit);
- ELSE EXCL (dial^[entry].obState, bit);
- END;
- END SetState;
-
- PROCEDURE InState (tree: ADDRESS; entry, bit: sINTEGER): BOOLEAN;
- VAR dial: tObjcTree;
- BEGIN
- dial:= tree; RETURN (CastToCard (bit) IN dial^[entry].obState);
- END InState;
-
- PROCEDURE GetThreeState (tree: ADDRESS; entry : sINTEGER): sINTEGER;
- VAR dial: tObjcTree;
- state : sBITSET;
- checked,
- sel : BOOLEAN;
- BEGIN
- dial := tree;
- state := dial^[entry].obState;
- checked := CHECKED IN state;
- sel := SELECTED IN state;
- IF checked & sel
- THEN
- RETURN SETNEW
- ELSIF ~checked & sel
- THEN
- RETURN CLEAR
- ELSIF ~checked & ~sel
- THEN
- RETURN NOCHANGE
- ELSE
- RETURN -1 (* FEHLER *)
- END;
- END GetThreeState;
-
- PROCEDURE SetThreeState (tree: ADDRESS; entry, val : sINTEGER);
- BEGIN
- CASE val OF
- 0 : ExclState (tree, entry, SELECTED);
- ExclState (tree, entry, CHECKED); |
- 1 : InclState (tree, entry, SELECTED);
- ExclState (tree, entry, CHECKED); |
- 2 : InclState (tree, entry, SELECTED);
- InclState (tree, entry, CHECKED); |
- ELSE
- END;
- END SetThreeState;
- (*----------------------------------------------------------------------*)
-
- TYPE Typeset = SET OF [GBOX..GCICON];
- PtrUSERBLK = POINTER TO USERBLK;
- USERBLK = RECORD
- ubCode: PROC;
- ubPara: MagicAES.Objcspec;
- END;
-
-
- PROCEDURE ObjcString (tree: ADDRESS; entry: sINTEGER; VAR str: ARRAY OF CHAR);
- VAR dial: tObjcTree;
- ob: sCARDINAL;
- pd: BOOLEAN;
- ub: PtrUSERBLK;
- BEGIN
- dial:= tree; pd:= FALSE;
- WITH dial^[entry] DO
- IF obType = GPROGDEF THEN
- pd:= TRUE; ub:= dial^[entry].obSpec.address;
- END;
- ob:= GetLowbyte (mtXobjects.GetObtype (tree, entry));
- IF ob = GBOXCHAR THEN
- IF pd THEN str[0]:= ub^.ubPara.Box.char;
- ELSE str[0]:= obSpec.Box.char;
- END;
- ELSIF ob IN Typeset {GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT} THEN
- IF pd THEN Assign (ub^.ubPara.TedPtr^.tePtext^, str);
- ELSE Assign (obSpec.TedPtr^.tePtext^, str);
- END;
- ELSIF ob IN Typeset {GBUTTON, GSTRING, GTITLE} THEN
- IF pd THEN Assign (ub^.ubPara.StringPtr^, str);
- ELSE Assign (obSpec.StringPtr^, str);
- END;
- END;
- END;
- END ObjcString;
-
- PROCEDURE ObjcStringAdr (tree: ADDRESS; entry: sINTEGER): ADDRESS;
- VAR dial: tObjcTree;
- ob: sCARDINAL;
- pd: BOOLEAN;
- ub: PtrUSERBLK;
- BEGIN
- dial:= tree; pd:= FALSE;
- WITH dial^[entry] DO
- IF obType = GPROGDEF THEN
- pd:= TRUE; ub:= dial^[entry].obSpec.address;
- END;
- ob:= GetLowbyte (mtXobjects.GetObtype (tree, entry));
- IF ob = GBOXCHAR THEN
- IF pd THEN RETURN ADR (ub^.ubPara.Box.char);
- ELSE RETURN ADR (obSpec.Box.char);
- END;
- ELSIF ob IN Typeset {GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT} THEN
- IF pd THEN RETURN ub^.ubPara.TedPtr^.tePtext;
- ELSE RETURN obSpec.TedPtr^.tePtext;
- END;
- ELSIF ob IN Typeset {GBUTTON, GSTRING, GTITLE} THEN
- IF pd THEN RETURN ub^.ubPara.StringPtr;
- ELSE RETURN obSpec.StringPtr;
- END;
- END;
- END;
- END ObjcStringAdr;
-
- PROCEDURE SetObjcString (tree: ADDRESS; entry: sINTEGER; REF str: ARRAY OF CHAR);
- VAR dial: tObjcTree;
- hi, tl: sINTEGER;
- (*$Reg*) i: sINTEGER;
- ob, c: sCARDINAL;
- pd: BOOLEAN;
- ub: PtrUSERBLK;
- ip: MagicAES.PtrICONBLK;
- BEGIN
- dial:= tree; c:= HIGH (str); hi:= CastToInt (c); pd:= FALSE;
- WITH dial^[entry] DO
- IF obType = GPROGDEF THEN
- pd:= TRUE; ub:= dial^[entry].obSpec.address;
- END;
- ob:= GetLowbyte (mtXobjects.GetObtype (tree, entry));
- IF ob = GBOXCHAR THEN
- IF pd THEN ub^.ubPara.Box.char:= str[0];
- ELSE obSpec.Box.char:= str[0];
- END;
- ELSIF ob IN Typeset {GICON, GCICON} THEN
- i:= 0;
- IF ob = GICON
- THEN
- IF pd THEN
- ip := ub^.ubPara.IconPtr;
- ELSE
- ip := obSpec.IconPtr;
- END;
- ELSE
- IF pd THEN
- ip := ADDRESS(ub^.ubPara.CiconPtr);
- ELSE
- ip := ADDRESS(obSpec.CiconPtr);
- END;
- END;
- WHILE ip^.ibPtext^[i] # 0C DO
- ip^.ibPtext^[i]:= ' '; INC (i);
- END;
- FOR i:= 0 TO hi DO
- IF ip^.ibPtext^[i] = 0C THEN RETURN; END;
- IF str[i] = 0C THEN RETURN; END;
- ip^.ibPtext^[i]:= str[i];
- END;
- ELSIF ob IN Typeset {GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT} THEN
- IF pd THEN tl:= ub^.ubPara.TedPtr^.teTxtlen-1;
- ELSE tl:= obSpec.TedPtr^.teTxtlen-1;
- END;
- FOR i:= 0 TO hi DO
- IF i = tl THEN RETURN; END;
- IF pd THEN ub^.ubPara.TedPtr^.tePtext^[i]:= str[i];
- ELSE obSpec.TedPtr^.tePtext^[i]:= str[i];
- END;
- IF str[i] = 0C THEN RETURN; END;
- END;
- ELSIF ob IN Typeset {GBUTTON, GSTRING, GTITLE} THEN
- i:= 0;
- IF pd THEN
- WHILE ub^.ubPara.StringPtr^[i] # 0C DO
- ub^.ubPara.StringPtr^[i]:= ' '; INC (i);
- END;
- ELSE
- WHILE obSpec.StringPtr^[i] # 0C DO
- obSpec.StringPtr^[i]:= ' '; INC (i);
- END;
- END;
- FOR i:= 0 TO hi DO
- IF pd THEN
- IF ub^.ubPara.StringPtr^[i] = 0C THEN RETURN; END;
- IF str[i] = 0C THEN RETURN; END;
- ub^.ubPara.StringPtr^[i]:= str[i];
- ELSE
- IF obSpec.StringPtr^[i] = 0C THEN RETURN; END;
- IF str[i] = 0C THEN RETURN; END;
- obSpec.StringPtr^[i]:= str[i];
- END;
- END;
- END;
- END;
- END SetObjcString;
-
- PROCEDURE SetObjcStringAdr (tree: ADDRESS; entry: sINTEGER; str: ADDRESS);
- VAR dial: tObjcTree;
- ob: sCARDINAL;
- pd: BOOLEAN;
- ub: PtrUSERBLK;
- BEGIN
- dial:= tree; pd:= FALSE;
- WITH dial^[entry] DO
- IF obType = GPROGDEF THEN
- pd:= TRUE; ub:= dial^[entry].obSpec.address;
- END;
- ob:= GetLowbyte (mtXobjects.GetObtype (tree, entry));
- IF ob IN Typeset {GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT} THEN
- IF pd THEN
- ub^.ubPara.TedPtr^.tePtext:= str;
- ub^.ubPara.TedPtr^.teTxtlen:= Length(ub^.ubPara.TedPtr^.tePtext^);
- ELSE
- obSpec.TedPtr^.tePtext:= str;
- obSpec.TedPtr^.teTxtlen:= Length(obSpec.TedPtr^.tePtext^);
- END;
- ELSIF ob IN Typeset {GBUTTON, GSTRING, GTITLE} THEN
- IF pd THEN ub^.ubPara.StringPtr:= str;
- ELSE obSpec.StringPtr:= str;
- END;
- END;
- END;
- END SetObjcStringAdr;
-
- PROCEDURE ObjcStrLen (tree: ADDRESS; entry: sINTEGER; VAR txt, tmplt: sINTEGER);
- VAR dial: tObjcTree;
- ob: sCARDINAL;
- pd: BOOLEAN;
- ub: PtrUSERBLK;
- BEGIN
- dial:= tree; pd:= FALSE; txt:= -1; tmplt:= -1;
- WITH dial^[entry] DO
- IF obType = GPROGDEF THEN
- pd:= TRUE; ub:= dial^[entry].obSpec.address;
- END;
- ob:= GetLowbyte (mtXobjects.GetObtype (tree, entry));
- IF ob IN Typeset {GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT} THEN
- IF pd THEN
- txt:= ub^.ubPara.TedPtr^.teTxtlen;
- tmplt:= ub^.ubPara.TedPtr^.teTmplen;
- ELSE
- txt:= obSpec.TedPtr^.teTxtlen;
- tmplt:= obSpec.TedPtr^.teTmplen;
- END;
- ELSIF ob IN Typeset {GBUTTON, GSTRING, GTITLE} THEN
- txt:= 0; tmplt:= -1;
- IF pd THEN WHILE ub^.ubPara.StringPtr^[txt] # 0C DO INC (txt); END;
- ELSE WHILE obSpec.StringPtr^[txt] # 0C DO INC (txt); END;
- END;
- END;
- END
- END ObjcStrLen;
-
- (*----------------------------------------------------------------------*)
-
- PROCEDURE ObjcParent (tree: ADDRESS; entry: sINTEGER): sINTEGER;
- VAR dial: tObjcTree;
- BEGIN
- IF entry <= 0 THEN RETURN 0; END;
- dial:= tree;
- LOOP
- WITH dial^[entry] DO
- IF obNext < entry THEN RETURN obNext; END;
- entry:= obNext;
- END;
- END;
- END ObjcParent;
-
- PROCEDURE ObjcPos (tree: ADDRESS; entry: sINTEGER; VAR x, y: sINTEGER);
- VAR (*$Reg*) i: sINTEGER;
- dial: tObjcTree;
- BEGIN
- dial:= tree; x:= 0; y:= 0; i:= entry;
- WHILE i > 0 DO
- i:= ObjcParent (dial, i);
- INC (x, dial^[i].obX);
- INC (y, dial^[i].obY);
- END;
- INC(x, dial^[entry].obX);
- INC(y, dial^[entry].obY);
- END ObjcPos;
-
- PROCEDURE ObjcArea (tree: ADDRESS; entry: sINTEGER; VAR rect: ARRAY OF LOC);
- VAR r: POINTER TO tRect;
- BEGIN
- ObjcRect (tree, entry, rect);
- IF entry > 0 THEN
- r:= ADR (rect); ObjcPos (tree, entry, r^.x, r^.y);
- END;
- END ObjcArea;
-
- PROCEDURE ObjcRect (tree: ADDRESS; entry: sINTEGER; VAR rect: ARRAY OF LOC);
- VAR dial: tObjcTree;
- r: POINTER TO tRect;
- BEGIN
- dial:= tree; r:= ADR (rect);
- r^.x:= dial^[entry].obX;
- r^.y:= dial^[entry].obY;
- r^.w:= dial^[entry].obWidth;
- r^.h:= dial^[entry].obHeight;
- END ObjcRect;
-
- PROCEDURE SetObjcRect (tree: ADDRESS; entry: sINTEGER; rect: ARRAY OF LOC);
- VAR dial: tObjcTree;
- r: POINTER TO tRect;
- BEGIN
- dial:= tree; r:= ADR (rect);
- dial^[entry].obX:= r^.x;
- dial^[entry].obY:= r^.y;
- dial^[entry].obWidth:= r^.w;
- dial^[entry].obHeight:= r^.h;
- END SetObjcRect;
-
- PROCEDURE ObjcFrame (tree: ADDRESS; entry: sINTEGER): sINTEGER;
- VAR (*$Reg*) ob: sCARDINAL;
- (*$Reg*) border: sINTEGER;
- dial: tObjcTree;
- pd: BOOLEAN;
- ub: PtrUSERBLK;
- BEGIN
- dial:= tree; border:= 0; pd:= FALSE;
- WITH dial^[entry] DO
- IF obType = GPROGDEF THEN
- pd:= TRUE; ub:= dial^[entry].obSpec.address;
- END;
- ob:= GetLowbyte (mtXobjects.GetObtype (tree, entry));
- IF ob = GBUTTON THEN
- border:= -1;
- IF DEFAULT IN obFlags THEN DEC (border); END;
- IF Exit IN obFlags THEN DEC (border); END;
- ELSIF ob IN Typeset {GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT} THEN
- IF pd THEN border:= ub^.ubPara.TedPtr^.teThickness;
- ELSE border:= obSpec.TedPtr^.teThickness;
- END;
- IF border > 127 THEN border:= border - 256; END;
- ELSIF ob IN Typeset {GBOX, GIBOX, GBOXCHAR} THEN
- IF pd THEN border:= ORD (ub^.ubPara.Box.frame);
- ELSE border:= ORD (obSpec.Box.frame);
- END;
- IF border > 127 THEN border:= border - 256; END;
- END; (* CASE *)
- IF (OUTLINED IN obState) AND (border > -3) THEN border:= -3; END;
- END;
- RETURN border;
- END ObjcFrame;
-
- PROCEDURE CalcArea (tree: ADDRESS; obj: sINTEGER; VAR rect: ARRAY OF LOC);
- VAR (*$Reg*) ob: sCARDINAL;
- (*$Reg*) border: sINTEGER;
- dial: tObjcTree;
- r: POINTER TO tRect;
- hAdd,
- vAdd: INTEGER;
- BEGIN
- dial:= tree; r:= ADR(rect);
- border:= ObjcFrame (tree, obj);
- ObjcArea (tree, obj, r^);
- IF border < 0 THEN (* Rahmen ausserhalb des Objekts! *)
- border:= ABS (border);
- DEC (r^.x, border);
- DEC (r^.y, border);
- INC (r^.w, border * 2);
- INC (r^.h, border * 2);
- END;
- IF (SHADOWED IN dial^[obj].obState) THEN
- INC (r^.w, border * 2); INC (r^.h, border * 2);
- END;
- (* Jetzt Anpassung an 3D-Buttons von MTOS *)
- IF (MagicAES.AESGlobal.apVersion >= $0400)
- OR ( (MagicAES.AESGlobal.apVersion >= $0340)
- & (MagicAES.AESGlobal.apVersion # $0399)) (* nicht unter Mag!X *)
- THEN
- IF (MagicAES.FL3DIND IN dial^[obj].obFlags)
- THEN
- (* Ist 3D-Objekt, Anpassung herausfinden *)
- IF MagicAES.ObjcSysvar (0, MagicAES.AD3DVALUE, 0, 0, hAdd, vAdd) > 0
- THEN
- DEC (r^.x, hAdd);
- DEC (r^.y, vAdd);
- INC (r^.w, hAdd*2);
- INC (r^.h, vAdd*2);
- END;
- END;
- END;
- END CalcArea;
-
- PROCEDURE ScanFlags (tree: ADDRESS; set, entry, flag: sINTEGER): sINTEGER;
- VAR (*$Reg*) o: sINTEGER;
- (*$Reg*) r: sINTEGER;
- t: tObjcTree;
- BEGIN
- IF tree # NIL THEN
- t:= tree; o:= entry;
- REPEAT
- CASE set OF
- SearchType: IF flag = t^[o].obType THEN RETURN o; END;|
- SearchState: IF CastToCard (flag) IN t^[o].obState THEN RETURN o; END;|
- SearchFlags: IF CastToCard (flag) IN t^[o].obFlags THEN RETURN o; END;|
- ELSE
- END; (* CASE *)
- IF (t^[o].obHead > -1) THEN
- r:= ScanFlags (t, set, t^[o].obHead, flag);
- IF r >= 0 THEN RETURN r; END;
- END;
- o:= t^[o].obNext;
- UNTIL o <= entry;
- END; (* IF tree *)
- RETURN -1;
- END ScanFlags;
-
- PROCEDURE ScanMenu (tree: ADDRESS; scan: sINTEGER; kbshift: sBITSET;
- VAR title, item: INTEGER): BOOLEAN;
- VAR (*$Reg*) o: sINTEGER;
- p, e, x: sINTEGER;
- t: tObjcTree;
- s: ARRAY [0..3] OF CHAR;
- n: ADDRESS;
- str: ARRAY [0..80] OF CHAR;
-
- BEGIN
- t:= tree; title:= -1; item:= -1; x:= 0;
-
- IF MagicAES.KCTRL IN kbshift THEN
- s[x]:= '^';
- ELSIF MagicAES.KALT IN kbshift THEN
- s[x]:= 07C;
- ELSE
- s[x]:= '['
- END;
- INC (x);
- s[x]:= CAP (CharCode (scan, kbshift));
- IF s[x] = 0C THEN RETURN FALSE; END;
- INC (x); s[x]:= 0C;
-
- title:= t^[t^[t^[0].obHead].obHead].obHead; (* Index erster Titel *)
- o:= t^[t^[t^[0].obHead].obNext].obHead; (* Index erste Box *)
-
- LOOP (* 1 *)
- item:= t^[o].obHead;
- LOOP (* 2 *)
- IF (t^[item].obType = GSTRING) AND NOT (DISABLED IN t^[item].obState) THEN
- (* ObjcString (t, item, str); *)
- IF Pos (s, t^[item].obSpec.StringPtr^, 0, FALSE) # SIZE (t^[item].obSpec.StringPtr^) THEN
- MagicAES.MenuTnormal (t, title, 0);
- RETURN TRUE;
- END;
- END;
- IF t^[item].obNext < item THEN EXIT; (* LOOP 2 *) END;
- item:= t^[item].obNext;
- END; (* LOOP 2 *)
- IF title > t^[title].obNext THEN EXIT; (* LOOP 1 *) END;
- title:= t^[title].obNext;
- o:= t^[o].obNext;
- END; (* LOOP 1 *)
- RETURN FALSE;
- END ScanMenu;
-
- PROCEDURE CharCode (scan: sINTEGER; kbshift: sBITSET): CHAR;
- VAR tab: MagicXBIOS.PtrKEYTAB;
- ptr: MagicXBIOS.Keycode;
- n: ADDRESS;
- BEGIN
- n:= Nil; tab:= MagicXBIOS.Keytbl (n, n, n);
- IF (MagicAES.KRSHIFT IN kbshift) OR (MagicAES.KLSHIFT IN kbshift) THEN
- ptr:= tab^.shift;
- ELSIF MagicAES.KCAPS IN kbshift THEN
- ptr:= tab^.capslock;
- ELSE
- ptr:= tab^.unshift;
- END;
- RETURN ptr^[scan];
- END CharCode;
-
- PROCEDURE ScanCode (ch: CHAR): INTEGER;
- VAR tab: MagicXBIOS.PtrKEYTAB;
- ptr: MagicXBIOS.Keycode;
- n: ADDRESS;
- i: sINTEGER;
- BEGIN
- n:= Nil; tab:= MagicXBIOS.Keytbl (n, n, n);
- FOR i:= 1 TO 53 DO
- ptr:= tab^.capslock;
- IF ptr^[i] = Cap (ch) THEN RETURN i; END;
- END;
- RETURN 0;
- END ScanCode;
-
- PROCEDURE DoubleClick (VAR value: sINTEGER): BOOLEAN;
- VAR b: sBITSET;
- double: BOOLEAN;
- BEGIN
- b:= CastToBitset (value);
- double:= Bit15 IN b;
- EXCL (b, Bit15);
- value:= CastToInt (b);
- RETURN double;
- END DoubleClick;
-
- PROCEDURE Bounce;
- VAR x, y: sINTEGER;
- button, b: sBITSET;
- BEGIN
- REPEAT GrafMkstate (x, y, button, b); UNTIL button = {};
- END Bounce;
-
- PROCEDURE AbsRect (VAR rect: ARRAY OF LOC);
- VAR r: POINTER TO tRect;
- BEGIN
- r:= ADR (rect); r^.w:= r^.w + r^.x - 1; r^.h:= r^.h + r^.y - 1;
- END AbsRect;
-
- PROCEDURE RelRect (VAR rect: ARRAY OF LOC);
- VAR r: POINTER TO tRect;
- BEGIN
- r:= ADR (rect); r^.w:= r^.w - r^.x; r^.h:= r^.h - r^.y;
- END RelRect;
-
- PROCEDURE RectToVars (rect: ARRAY OF LOC; abs: BOOLEAN;
- VAR x, y, w, h: sINTEGER);
- VAR r: POINTER TO tRect;
- BEGIN
- r:= ADR (rect);
- x:= r^.x; y:= r^.y; w:= r^.w; h:= r^.h;
- IF abs THEN INC (w, r^.x); INC(h, r^.y); END;
- END RectToVars;
-
- PROCEDURE VarsToRect (x, y, w, h: sINTEGER; abs: BOOLEAN;
- VAR rect: ARRAY OF LOC);
- VAR r: POINTER TO tRect;
- BEGIN
- r:= ADR (rect);
- r^.x:= x; r^.y:= y; r^.w:= w; r^.h:= h;
- IF abs THEN INC (r^.w, x); INC(r^.h, y); END;
- END VarsToRect;
-
- PROCEDURE AbsRectToVars (rect: ARRAY OF LOC; abs: BOOLEAN;
- VAR x, y, w, h: sINTEGER);
- VAR r: POINTER TO tRect;
- BEGIN
- r:= ADR (rect);
- x:= r^.x; y:= r^.y; w:= r^.w; h:= r^.h;
- IF NOT abs THEN DEC (w, r^.x); DEC(h, r^.y); END;
- END AbsRectToVars;
-
- PROCEDURE AbsVarsToRect (x, y, w, h: sINTEGER; abs: BOOLEAN;
- VAR rect: ARRAY OF LOC);
- VAR r: POINTER TO tRect;
- BEGIN
- r:= ADR (rect);
- r^.x:= x; r^.y:= y; r^.w:= w; r^.h:= h;
- IF NOT abs THEN DEC (r^.w, x); DEC(r^.h, y); END;
- END AbsVarsToRect;
-
- END mtUtils.
-